package com.jufanshare.myblog.service.base;

import com.jufanshare.myblog.common.util.StringUtil;
import org.beetl.sql.core.SQLManager;
import org.beetl.sql.core.db.KeyHolder;
import org.beetl.sql.core.engine.PageQuery;
import org.beetl.sql.core.query.LambdaQuery;
import org.beetl.sql.core.query.Query;
import org.springframework.beans.factory.annotation.Autowired;

import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.Map;

/**
 * 作用：实现继承了BaseMapper接口的BaseService接口
 * 作者：Tiddler
 * 时间：2019/1/21 19：22
 * 类名： BaseServiceImpl
 **/
public class BaseServiceImpl<T> implements BaseService<T> {
    private Class<T> clazz;

    @Autowired
    private SQLManager sqlManager;

    /**
     * 构造函数中取得当前泛型<T>的Class对象
     */
    public BaseServiceImpl() {
        // 获取当前new的对象的泛型的父类类型
        ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
        // 获取第一个类型参数的真实类型
        this.clazz = (Class<T>) pt.getActualTypeArguments()[0];
    }
    @Override
    public PageQuery<T> findByPage(T t, PageQuery<T> pageQuery) {
        pageQuery.setParas(t);
        String mdFileName = StringUtil.firstCharToLowerCase(clazz.getSimpleName());//根据泛型获取类名，并且首字母小写，这样就和beetl自动生成的md文件名一致
        PageQuery<T> byPage = sqlManager.pageQuery(mdFileName+".findByPage", clazz, pageQuery);
        return byPage;
    }
    @Override
    public void insert(T t) {
        sqlManager.insert(t);
    }

    @Override
    public void insert(T t, boolean b) {
        sqlManager.insert(t,b);
    }

    @Override
    public void insertTemplate(T t) {
        sqlManager.insertTemplate(t);
    }

    @Override
    public void insertTemplate(T t, boolean b) {
        sqlManager.insert(t,b);
    }

    @Override
    public void insertBatch(List<T> list) {
        sqlManager.insertBatch(clazz,list);
    }

    @Override
    public KeyHolder insertReturnKey(T t) {
        int insert = sqlManager.insert(t, true);
        KeyHolder keyHolder = new KeyHolder();
        keyHolder.setKey(insert);
        return keyHolder;
    }

    @Override
    public int updateById(T t) {
        return sqlManager.updateById(t);//所有字段都会参与update，包括null项
    }

    @Override
    public int updateTemplateById(T t) {
        return sqlManager.updateTemplateById(t);//不为null项才会参与update
    }

    @Override
    public int deleteById(Object o) {
        return sqlManager.deleteById(clazz,o);
    }

    @Override
    public T unique(Object o) {
        return sqlManager.unique(clazz,o);
    }

    @Override
    public T single(Object o) {
        return sqlManager.single(clazz,o);
    }

    @Override
    public T lock(Object o) {
        return sqlManager.lock(clazz,o);
    }

    @Override
    public List<T> all() {
        return sqlManager.all(clazz);
    }

    @Override
    public List<T> all(int i, int i1) {
        return sqlManager.all(clazz,i,i1);
    }

    @Override
    public long allCount() {
        return sqlManager.allCount(clazz);
    }

    @Override
    public List<T> template(T t) {
        return sqlManager.template(t);
    }

    @Override
    public <T1> T1 templateOne(T1 t1) {
        return sqlManager.templateOne(t1);
    }

    @Override
    public List<T> template(T t, int i, int i1) {
        return sqlManager.template(t,i,i1);
    }

    @Override
    public void templatePage(PageQuery<T> pageQuery) {
        //此处尚有疑惑，慎用
        sqlManager.template(clazz,pageQuery.getParas(),(pageQuery.getPageNumber()-1)*pageQuery.getPageSize(),pageQuery.getPageSize(),pageQuery.getOrderBy());
    }

    @Override
    public long templateCount(T t) {
        return sqlManager.templateCount(t);
    }

    @Override
    public List<T> execute(String s, Object... objects) {
        //此处尚有疑惑，慎用
        return sqlManager.execute(s,clazz,objects);
    }

    @Override
    public int executeUpdate(String s, Object... objects) {
        //此处尚有疑惑，慎用
        return sqlManager.executeUpdate(s,objects);
    }

    @Override
    public SQLManager getSQLManager() {
        return sqlManager;
    }

    @Override
    public Query<T> createQuery() {
        return sqlManager.query(clazz);
    }

    @Override
    public LambdaQuery<T> createLambdaQuery() {
        return sqlManager.lambdaQuery(clazz);
    }

}
